package com.systop.ltbook.order.cart.model;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 购物车类
 */
public class Cart {
	/** 购物项Map集合 */
	private Map<Integer, CartItem> items = new HashMap<Integer, CartItem>();

	// 总额
	private Double total = 0D;

	/**
	 * 添加购物车项
	 * 
	 * @param cartItem
	 */
	public void addItem(CartItem itmAdd) {
		Integer id = itmAdd.getBook().getId();
		CartItem itm = null;
		if (items.containsKey(id)) {
			itm = items.get(id);
			itm.setCount(itm.getCount() + itmAdd.getCount());
		} else {
			itm = itmAdd;
			items.put(id, itm);
		}
		if (itm.getBook().getPrice() != null) {
			itm.setAmount(itm.getCount() * itm.getBook().getPrice());
		} else {
			itm.setAmount(0d);
		}

		calculateTotal();
	}

	public void modify(Integer id, int count) {
		CartItem itm = items.get(id);
		if (itm != null) {
			itm.setCount(count);
			itm.setAmount(itm.getCount() * itm.getBook().getPrice());
			calculateTotal();
		}
	}

	/**
	 * 修改购物车项中的图书数量
	 * 
	 * @param itm
	 */
	public void modifyCount(CartItem itmArg) {
		// 从购物车中得到以要添加的购物车项的key为键的购物车项
		CartItem itm = items.get(itmArg.getBook().getId());
		// 如果不存在存在该购物车项,则修改购物车项中的数量
		if (itm != null) {
			itm.setCount(itmArg.getCount());
			itm.setAmount(itm.getCount() * itm.getBook().getPrice());
			calculateTotal();
		}
	}

	/**
	 * 从购物车中删除购物车项
	 * 
	 * @param id
	 *            要删除的购物车项的图书id,即map中的id
	 */
	public void removeItem(Integer id) {
		items.remove(id);
		calculateTotal();
	}

	/**
	 * 清除购物车
	 */
	public void clear() {
		items.clear();
		total = 0d;
	}

	/**
	 * 计算总金额
	 */
	private void calculateTotal() {
		total = 0d;
		Iterator<Integer> itr = items.keySet().iterator();
		while (itr.hasNext()) {

			total += items.get(itr.next()).getAmount();
		}
	}

	public Double getTotal() {
		return total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

	public Map<Integer, CartItem> getItems() {
		return items;
	}

	public void setItems(Map<Integer, CartItem> items) {
		this.items = items;
	}

}
